C++ ostringstream 奇怪的行为
全部标签 我已经用谷歌的nacl编译器编译了一些Qt代码,但是ncval验证器没有理解它。众多例子之一:src/corelib/animation/qabstractanimation.cpp:165相关代码如下:#defineQ_GLOBAL_STATIC(TYPE,NAME)\staticTYPE*NAME()\{\staticTYPEthisVariable;\staticQGlobalStaticthisGlobalStatic(&thisVariable);\returnthisGlobalStatic.pointer;\}#ifndefQT_NO_THREADQ_GLOBAL_STA
编译器:来自Nuwen发行版的64位MinGWG++4.9.1,在Windows8.1下。代码:#ifdefINCLUDE_IOSTREAM#include#endif#include//::snprintf#include//EXIT_SUCCESS,EXIT_FAILURE#include//std::exception#ifdefsnprintf#errorsnprintfdefinedasmacro#endif#ifdef_MSC_VERautoconstsnprintf=_snprintf;#endifvoidtest(doubleconstvalue,intconstpre
使用C++17auto模板参数我遇到了另一个g++/clang++分歧。给定以下简单代码templatestructfoo;templatestructfoo{};intmain(){foof42;//我看到clang++(8.0.0,例如)编译g++(9.2.0,例如)给出以下错误的代码prog.cc:Infunction'intmain()':prog.cc:12:13:error:aggregate'foof42'hasincompletetypeandcannotbedefined12|foof42;|^~~如果我们使用int常量而不是long常量,两个编译器都会编译foof4
在一些遗留代码中看到以下内容:classA{&A(){...}}“&”有什么用?它在VC++2008中编译,看起来像默认构造函数,错误gcc无法编译它。 最佳答案 尽管语法上&在语法的这个位置是允许的(它是一个declarator的例子,它是序列:ptr-operatordeclarator,&是一个ptr-operator),在语义上它没有意义并且在这里是不允许的。纯粹从语法角度来看它是有效的,这一事实可能表明了VisualStudio可能接受它的原因。检查可能性,这个声明看起来像一个没有返回类型的函数定义。7[dcl.dcl]/
当我在MSVSC++2010上运行此代码时:#includeintmain(){constinta=10;constint*b=&a;int*c=(int*)b;*c=10000;std::cout输出是:0037F7840037F784100001010编写该代码的动机是来自Stroustrup的“TheC++ProgrammingLanguage”中的这句话:“可以通过显式类型转换显式地移除对指向const的指针的限制”。我知道试图修改常量在概念上是错误的,但我发现这个结果很奇怪。谁能解释一下背后的原因? 最佳答案 让我们从显而
这是我的简单代码:intmain(){doubled1=10000000000.0;constdoubled2=10000000000.0;cout(d1)(d2)(10000000000.0)输出是:-214748364821474836472147483647这让我大吃一惊。为什么正double有时会转换为负整数?我正在使用g++:GCC版本4.4.3(Ubuntu4.4.3-4ubuntu5)。 最佳答案 当int不足以容纳值时,将double转换为int会产生未定义的行为.[n3290:4.9/1]:Aprvalueofaf
人们通常会对正在编写代码的特定平台做出假设,例如,有符号整数使用二进制补码存储,或者(0xFFFFFFFF==-1),或类似性质的东西。是否存在一种工具可以检查代码库是否存在此类最常见的违规行为(对于我们这些想要可移植代码但没有奇怪的非二进制补码机器的人)?(我上面的示例特定于有符号整数,但我也对其他错误(例如对齐或字节顺序)感兴趣) 最佳答案 您可能希望打开各种级别的编译器警告,您可以将警告视为错误。如果您知道您在代码的不同位置做出了其他假设,您可以断言它们。如果您可以使用静态断言来做到这一点,您将在编译时失败。
默认情况下,std::stack的“底层容器”是std::deque。因此,对于std::deque而言,任何未定义的行为对于std::stack而言都是未定义的行为。cppreference和其他站点在描述成员函数的行为时使用术语“有效地”。我认为这意味着它适用于所有意图和目的。因此,调用top()和pop()等同于调用back()和pop_back(),并在空容器上调用这些是未定义的行为。根据我的理解,它是未定义行为的原因是为了保留不抛出保证。我的理由是std::vector的operator[]具有不抛出保证,如果容器大小大于N,则为未定义行为,但at()有很强的保证,如果n超出
我在某处发现了以下用于将文件读入字符串的习语:std::ifstreamfile("path/to/some/file.ext");std::stringcontents(std::istreambuf_iterator(file),(std::istreambuf_iterator()));它现在工作得很好。但是,如果我删除第二个迭代器参数周围的括号,即:std::stringcontents(std::istreambuf_iterator(file),std::istreambuf_iterator());一旦我尝试在字符串对象上调用任何方法,例如:constchar*buffe
考虑以下代码:classFoo{public://class-specificFoooperator+(Foo&rhs){returnFoo();//Justreturnatemporary}void*operatornew(size_tsd){returnmalloc(sd);}};//globalFoooperator+(Foo&lhs,Foo&rhs){returnFoo();}void*operatornew(size_tsd){returnmalloc(sd);}此代码无法编译,声明调用不明确,因为它匹配两个运算符:Fooa,b;a+b;但是这个带有new运算符的编译得很好,